<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>
        function Person(name, age) {
            this.name = name;
            this.age = age;
            this.say = function() {}
        }

        var p1 = new Person();
        var p2 = new Person();

        // p1对象的say和p2对象的say是否是同一个方法
        console.log(p1.say === p2.say); // false

        // 由于say方法功能相似，但是不是同一个方法（没有指向同一块内存，造成内存浪费）

        // 解决方法，把他们定义在共同的父对象中
        // 他们共同的父对象可以使用 Person.prototype 来获得
        Person.prototype.run = function() {
            console.log("时速20KM");
        }

        p1.run();
        p2.run();

        // p1.run和p2.run是否是同一个方法
        console.log(p1.run === p2.run); // true

        /*
            结论：只要往某个构造函数的prototype对象中添加某个属性、方法，那么这样的属性和方法可以被所有的构造函数实例
            所共享，这里的 构造函数的prototype对象 称之为原型对象
        */


        // 那么，Person的原型对象是谁？
        //  ---> 首先要知道Person的构造函数 -- Function
        //  ---> 所以 Person 的原型对象是 Function.prototype

        // p1 的原型对象是谁呢？
        // ---> 首先要知道p1是谁创建的 --- Person
        // ---> 所以 p1 的原型对象是：Person.prototype
    </script>
</body>
</html>